<?php
/**
 * Контроллер административной панели, реализующий управление виджетами
 * 
 * @category Phorm
 * @package Controller_Module_Control
 * @name /Phorm/Controller/Module/Control/Widgets.php
 * @copyright phorm.ru
 * @since 05.05.2012
 * @author vladimir@kachalov.net
 */

class Phorm_Controller_Module_Control_Widgets extends Phorm_Controller_Controller {
	
	/**
	 * Экземпляр класса виджетов
	 * @var Phorm_Widget
	 */
	public $Widget;
	
	
	/**
	 * Предиспетчер
	 * 
	 * @return void
	 */
		
	public function preDispatch() {
		
		$this->Widget = new Phorm_Widget();
		
	}
	
	
	/**
	 * Главная страница
	 * 
	 * @return void
	 */
		
	public function indexAction() {
		
		$options = Phorm_Config::xml('grids/control/widgets.xml');
		
		if($this->_request->isXmlHttpRequest()) {
			
			$rows = $this->Widget->getWidgetsSetsFullList();
			$paginator = $this->Widget->getPaginator();

			$this->_helper->json(Phorm_JQuery_DataGrid::data($rows,$paginator,$options));
			
		} else {
			
			$this->view->assign('WidgetsDataTable',$this->view->DataGrid('WidgetsDataTable',$options));
			
		}
		
	}
	
	
	/**
	 * Создание набора виджетов
	 * 
	 * @return void
	 */
		
	public function addAction() {
		

		$form = $this->Widget->getWidgetSetForm('setadd');
		
		if($this->_request->isPost()) {
			
			if($form->isValid($this->_request->getPost())) {
				
				if($this->Widget->saveWidgetsSet($form->getValues())) {
					return $this->composeSuccessMessage('Набор виджетов сохранен','/control/widgets/');
				} else {
					$this->composeTransactionErrorMessage($this->Widget->_errors);
				}
						
			} else {
				
				/**
				 * Устанавливаем значения пришедшие с формы и ошибки вручную
				 * @todo Перенести непосредственно в класс элемента
				 */
				$FormData = $form->getValues();	
				$Messages = $form->getMessages();
				$form = $this->Widget->getWidgetSetForm('setadd',Zend_Json::encode($FormData['widgets']));	
				$form -> setDefaults($FormData);
				foreach ($Messages as $element=>$errors) $form->$element->setErrors($errors);	
						
			}
			
		}
		
		$this->view->assign('Form',$form);

	}
	
	
	/**
	 * Редактирование набора виджетов
	 * 
	 * @return void
	 */
		
	public function editAction() {
		
		if(isset($this->_params['setid']) && $SetInfo = $this->Widget->getWidgetsSetInfo($this->_params['setid'])) {

			$form = $this->Widget->getWidgetSetForm('setadd',$SetInfo['widgets']);
			$form -> setDefaults($SetInfo);
			
			if($this->_request->isPost()) {
				
				if($form->isValid($this->_request->getPost())) {
					
					$FormData = $form->getValues();
					$FormData['setid'] = $SetInfo['setid'];
				
					if($FormData = $this->Widget->saveWidgetsSet($FormData)) {
						return $this->composeSuccessMessage('Изменения внесены','/control/widgets/');
					} else {
						$this->composeTransactionErrorMessage($this->Widget->_errors);
					}
					
				} else {
					
					/**
					 * Устанавливаем значения пришедшие с формы и ошибки вручную
					 * @todo Перенести непосредственно в класс элемента
					 */
					$FormData = $form->getValues();	
					$Messages = $form->getMessages();
					$form = $this->Widget->getWidgetSetForm('setadd',Zend_Json::encode($FormData['widgets']));	
					$form -> setDefaults($FormData);
					foreach ($Messages as $element=>$errors) $form->$element->setErrors($errors);
					
				}
				
			}
			
			$this->view->assign('Form',$form);
		
		} else {
			
			return $this->composeErrorMessage('Набор виджетов с указанным Id не найден','/control/widgets/');
			
		}
		
	}
	
	
	/**
	 * Диалоговое окно для добавления/редактирования виджетов
	 * 
	 * @return void
	 */
		
	public function dialogAction() {

		$this->_params['iframe'] = true;
		
		$this->_boot->jquery->addJavascriptFile($this->view->baseUrl().'/ui/js/jquery.json.min.js');
		
		if(isset($this->_params['layout'])) {

			/**
			 * Если нам известен тип виджета, то добавляем форму редактирования виджета
			 */
			
			if(isset($this->_params['typeid']) && $TypeInfo = $this->Widget->getWidgetTypeInfo($this->_params['typeid'])) {
				
				$form = $this->Widget->getWidgetForm('edit',$TypeInfo);
				
				$form->setDefaults(array('typeid'=>$this->_params['typeid']));
				
				if($this->_request->isPost()) {
					
					if($form->isValid($this->_request->getPost())) {
						
						$FormData = $form->getValues();
						unset($FormData['separator']); // @todo Надо описать, что в виджетах запрещена опция separator
						
						/**
						 * @todo Надо как-то абстрагироваться от имени js-переменной WidgetsLayouts либо как-то ее определять глобально
						 * @see Phorm_JQuery_View_Helper_SelectWidgetsLayout
						 */
						
						$position = isset($this->_params['position']) ? $this->_params['position'] : -1;
						$js = "window.parent.frames[0].WidgetsLayouts.getWidgetValues('".$this->_params['layout']."',".$position.",\"".addslashes(Zend_Json_Encoder::encode($FormData))."\");";
						$this->_boot->jquery->addOnLoad($js);
						
					}
					
				} elseif (isset($this->_params['position'])) {
					
					/**
					 * @todo Надо как-то абстрагироваться от имени js-переменной WidgetsLayouts либо как-то ее определять глобально
					 * @see Phorm_JQuery_View_Helper_SelectWidgetsLayout
					 */
						
					$js = "window.parent.frames[0].WidgetsLayouts.setWidgetValues('".$this->_params['layout']."',".$this->_params['position'].",$('form:first'));";
					$this->_boot->jquery->addOnLoad($js);
					
				}
				
				$this->view->assign('Form',$form);
		 
			/**
			 * Если тип виджета неизвестен, то добавляем форму создания виджета (селект типа виджета)
			 */
			
			} else {
				
				$form = $this->Widget->getWidgetForm('add');
				$this->view->assign('Form',$form);
				
			}
		
		} else {
			
			$this->view->assign('Errors',array($this->_translate->_('Не выбран макет отображения')));
			
		}

	}
	
	
	/**
	 * Удаление набора виджетов
	 *
	 * @return void
	 */
	
	public function deleteAction() {
		
		
		
	}
	
}